package com.guang.readandwritelock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author lg
 *
 * @Description 在读锁的情况下，不能够获取得到写锁 称之为锁升级
 *
 *              读读是并发的，但是写写是同步的
 *
 *              因为可能会在多线程条件产生死锁，在源码中直接拒绝
 *              可能存在的情况：
 *                      t1 r  t2 r
 *
 *                   然后t1在读锁中想要获取写锁，那么就必须要等到写锁释放了之后才能够获取得到写锁
 *                   而t2持有了读锁的时候，t1就无法持有，需要等待；而t2想要获取得到锁，就需要等待t1将锁释放掉
 *          那么看下源码即可知道
 * @date 2022/10/18 17:05
 */
public class ReadWriteLockDemoOne {
    private final static Logger logger = LoggerFactory.getLogger(ReadWriteLockDemoOne.class);
    static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    public static void main(String[] args) {

        new Thread(()->{
            reentrantReadWriteLock.readLock().lock();
            logger.info("获取得到了读锁");
            reentrantReadWriteLock.writeLock().lock();
            logger.info("在获取得到读锁的情况下来获取得到写锁");
            reentrantReadWriteLock.writeLock().unlock();
            logger.info("在读锁的情况下释放了读锁");
            reentrantReadWriteLock.readLock().unlock();
            logger.info("释放读锁");
        }).start();
    }
}
